home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / xlt86.lbr / XLT86.AQM / XLT86.ASM
Assembly Source File  |  1979-12-31  |  41KB  |  2,769 lines

  1. ;*******************************************************
  2. ;
  3. ;            XLT86
  4. ;
  5. ; Translates Intel 8080 assembly language source code
  6. ;  to Intel 8086 assembly language source code.
  7. ;
  8. ; 11/11/84 Frank J. Zerilli
  9. ;
  10. VERS    EQU    106
  11. ;
  12. ;*******************************************************
  13. ;
  14. ;      XLT86 processes lines with the exclamation point
  15. ; statement separator correctly.  It strips trailing
  16. ; blanks or tabs from lines.  It replaces initial
  17. ; asterisks in lines with semicolons.  It provides
  18. ; several options to format the output file for best
  19. ; appearance.
  20. ;      This program gives the choice of converting the
  21. ; case of instructions to upper or lower case or of
  22. ; trying to preserve the case of instructions.
  23. ;      An activity dot is printed on the console for
  24. ; every 100 lines of input processed.
  25. ;
  26. ; Command line:
  27. ;
  28. ;     XLT86 [d:]srcfile[.typ] [d:destfile.typ]
  29. ;
  30. ;      All parameters in brackets are optional, and, if
  31. ; omitted, the default values are:
  32. ;
  33. ;  Source file-type      -- ASM
  34. ;  Destination file-type -- A86
  35. ;  Destination file-name -- same as the source file-name
  36. ;  Drive                 -- current drive
  37. ;
  38. ; FLAG LOCATIONS:
  39. ;
  40. ; 103H -- Change to non-zero value to suppress
  41. ;      translation of several non-standard opcodes:
  42. ;      REQ, RNE, RLT, RGE, CEQ, CNE, CLT, CGE
  43. ;      JEQ, JNE, JLT, JGE,
  44. ;      ENT, NAM, RAM, ROG, IFC, ICL, LST, MAC
  45. ;
  46. ; 104H -- If non-zero (default) XLT86 converts lines
  47. ;      with multiple statements separated by DR's EP
  48. ;      separator into separate lines.
  49. ;      Change to zero for output on a single line
  50. ;      with the translated statements separated by
  51. ;      EP.
  52. ;
  53. ; 107H--  If zero (default) XLT86 translates
  54. ;
  55. ;        PUSH PSW    POP PSW
  56. ;
  57. ;      to
  58. ;
  59. ;        LAHF        POP AX
  60. ;        PUSH AX        SAHF
  61. ;
  62. ;      Otherwise, the translation is
  63. ;
  64. ;        LAHF        POP AX
  65. ;        XCHG AH,AL    XCHG AH,AL
  66. ;        PUSH AX        SAHF
  67. ;        XCHG AH,AL
  68. ;
  69. ; 108H-- If zero (default) XLT86 translates
  70. ;
  71. ;        INX rp        DCX rp
  72. ;
  73. ;     to
  74. ;
  75. ;        INC rp'        DEC rp'
  76. ;
  77. ;     Otherwise, the translation is
  78. ;
  79. ;        PUSHF        PUSHF
  80. ;        INC rp'        DEC rp'
  81. ;        POPF        POPF
  82. ;
  83. ; 109H-- If zero (default) XLT86 translates
  84. ;
  85. ;        DAD rp
  86. ;
  87. ;     to
  88. ;
  89. ;        ADD BX,rp'
  90. ;
  91. ;     Otherwise, the translation is
  92. ;
  93. ;        PUSHF
  94. ;        ADD BX,rp'
  95. ;        POPF
  96. ;
  97.  
  98. N00    EQU    0
  99. N01    EQU    1
  100. ;
  101. N07    EQU    7
  102. N09    EQU    9    ;tab every 8th col.
  103. NF8    EQU    0F8H    ;mod 8
  104. ;
  105. LBUFLN    EQU    80    ;line buffer length
  106. OPBFLN    EQU    5    ;opcode buffer length
  107. MEMSIZ    EQU    4    ;memory available in Kb
  108. IBNUM    EQU    4*MEMSIZ
  109. OBNUM    EQU    4*MEMSIZ
  110. RECLEN    EQU    128    ;
  111. STCKLN    EQU    128    ;stack size
  112. IBFLEN    EQU    IBNUM*RECLEN
  113. OBFLEN    EQU    OBNUM*RECLEN
  114. ;
  115. CTRLC    EQU    3
  116. EOT    EQU    4
  117. BEL    EQU    7
  118. HT    EQU    9
  119. LF    EQU    0AH
  120. CR    EQU    0DH
  121. ESC    EQU    1BH
  122. QUOTE    EQU    27H
  123. ;
  124. ABORT    EQU    0000
  125. BDOS    EQU    0005
  126. DFCB1    EQU    005CH
  127. DFCB2    EQU    006CH
  128. ;
  129. FNLEN    EQU    8
  130. EOS    EQU    EOT    ; replacement for exclamation pt
  131. EOF    EQU    1AH
  132. NFF    EQU    0FFH    ;disk error return
  133. ;
  134. ;    BDOS FUNCTIONS
  135. ;
  136. nCIN    EQU    1
  137. nCOUT    EQU    2
  138. nCDAV    EQU    0BH
  139. nOPEN    EQU    0FH
  140. nCLOSE    EQU    10H
  141. nDEL    EQU    13H
  142. nRDNR    EQU    14H
  143. nWRNR    EQU    15H
  144. nCREAT    EQU    16H
  145. nCDISK    EQU    19H
  146. nDMA    EQU    1AH
  147. ;
  148. ;
  149.     ORG    100H
  150. ;
  151.     JMP    START
  152. ;
  153. ; OPTION FLAGS
  154. ;
  155. PSEFLG    DB    0    ;(103H) 0 to translate non-
  156.             ;  standard opcodes
  157. MLTLFL    DB    0FFH    ;(104H) 0 to put input line with
  158.             ;  exc. pt. to output on one line
  159. TCASFL    DB    0    ;(105H) 0 to preserve case
  160.             ;
  161. LCASFL    DB    0    ;(106H) 0 for upper case if
  162.             ;  TCASFL not zero
  163. PSWFL    DB    0    ;(107H) non-zero to preserve 8080
  164.             ;  order of PSW registers on stack
  165. INXFL    DB    0    ;(108H) non-zero to preserve flags
  166.             ;  with INX and DCX translations
  167. DADFL    DB    0    ;(109H) non-zero to preserve flags
  168.             ;  with DAD translation
  169. ;
  170. ;  HELP MESSAGE
  171. ;
  172. HMSG1:
  173.  
  174.  DB CR,LF
  175.  DB LF
  176.  DB 'XLT86 translates Intel 8080 assembly language source',CR,LF
  177.  DB 'code into Intel 8086 assembly language source code.',CR,LF
  178.  DB LF
  179.  DB 'It is invoked by a command of the form:',CR,LF
  180.  DB LF
  181.  DB '    XLT86 [d:]srcfile[.typ] [d:destfile.typ]',CR,LF
  182.  DB LF
  183.  DB 'The brackets denote optional parameters and the ',CR,LF
  184.  DB 'default values are:',CR,LF
  185.  DB LF
  186.  DB '    Source file-type      --  ASM',CR,LF
  187.  DB '    Destination file-type --  A86',CR,LF
  188.  DB '    Destination file-name --  same as source file-name',CR,LF
  189.  DB '    Drive                 --  current drive',CR,LF
  190.  DB CR,LF
  191.  DB 'Press any key to continue - ',0
  192.  
  193. HMSG2:
  194.  
  195.  DB CR,LF
  196.  DB LF
  197.  DB 'Examples:',CR,LF
  198.  DB LF
  199.  DB 'XLT86 PRGM1               --translates PRGM1.ASM to PRGM1.A86',CR,LF
  200.  DB 'XLT86 PRGM1 PRGM2         --translates PRGM1.ASM to PRGM2.A86',CR,LF
  201.  DB 'XLT86 PRGM1.TXT PRGM2.MAC --translates PRGM1.TXT to PRGM2.MAC',CR,LF
  202.  DB LF
  203.  DB 'XLT86 also has the following features:',CR,LF
  204.  DB LF
  205.  DB 'Case will be preserved as well as possible -- if an opcode has',CR,LF
  206.  DB 'a lower case character, the translated opcode will be in lower',CR,LF
  207.  DB 'case.',CR,LF
  208.  DB LF
  209.  DB 'All asterisks at the beginning of lines will be replaced with',CR,LF
  210.  DB 'semicolons.',CR,LF
  211.  DB LF
  212.  DB 'A dot is printed on the console for every 100 lines of input ',CR,LF
  213.  DB 'processed.',CR,LF
  214.  DB LF
  215.  DB 0
  216. ;
  217. ;=============================================================================
  218. ;
  219. ; Program begins here
  220. ;
  221. START:
  222.     LXI    H,0
  223.     DAD    SP
  224.     SHLD    SPBDOS
  225.  
  226.     LXI    SP,STACK
  227.  
  228.     LDA    DFCB1+1    ; check for a file name
  229.     CPI    ' '    ; print help if no name
  230.     JNZ    BEGIN    ; no help requested
  231.     LXI    D,SIGNON
  232.     CALL    PRTLIN
  233.     LXI    D,HMSG1    ; print help message
  234.     CALL    PRTLIN
  235.     MVI    C,nCIN    ; wait for any character
  236.     CALL    BDOS
  237.     LXI    D,HMSG2    ; print rest of help
  238.     CALL    PRTLIN
  239.     LHLD    SPBDOS    ; retrieve system stack
  240.     SPHL        ;  pointer and pop
  241.     RET        ;  to PC
  242.  
  243. BEGIN:    CALL    HELLO    ;signon, open in & out files
  244. NXTLIN:    CALL    GETLIN    ;get line from input file to buf
  245.     CALL    PROCLIN    ; process line
  246.     JMP    NXTLIN
  247. ;
  248. ;
  249. ;
  250.  
  251. ;*******************************************************
  252. ;
  253. ;    Print signon, open input
  254. ;    and output files.
  255. ;
  256. HELLO:    LXI    D,SIGNON
  257.     CALL    PRTLIN
  258. HELLO0:    MVI    A,'D'    ; translate DB & EQU (for
  259.     STA    OPTBDB    ;  uniform formatting)
  260.     MVI    A,HT    ; Default is tab after opcode
  261.     STA    MLTSPC    ;  for stmts on separate lines
  262.     MVI    A,HT    ; HT after opcode
  263.     STA    PUTHT+1
  264.     MVI    A,41    ; tab comments to col 33
  265.     STA    PUTND5+1
  266.     MVI    A,0FEH    ; CP instruction
  267.     STA    EXCLAM
  268.     XRA    A
  269.     STA    TCASFL    ; don't convert case
  270.     STA    LCASFL    ; lower case flag
  271.     LXI    H,NEWLSP
  272.     SHLD    SEPMSG
  273.  
  274.     LDA    PSEFLG    ; translate non-standard
  275.     ORA    A    ;  opcodes ?
  276.     CNZ    NXPSD
  277.  
  278.     LXI    D,DBMSG
  279.     CALL    PRTLIN    ;
  280.     CALL    CHKYES    ; xlat DB & EQU ?
  281.     CPI    ESC
  282.     JZ    HELLO0
  283.     CPI    CTRLC
  284.     JZ    ABORT
  285.     CPI    'Y'
  286.     CNZ    NXDBEQ
  287.  
  288.     LDA    MLTLFL    ; force space after opcode
  289.     ORA    A    ;  if MLTLFL not set
  290.     JZ    HELLO2
  291.     LXI    D,SPCMSG
  292.     CALL    PRTLIN    ; use space after
  293.     CALL    CHKYES    ; opcode ?
  294.     CPI    ESC
  295.     JZ    HELLO0
  296.     CPI    CTRLC
  297.     JZ    ABORT
  298.     CPI    'Y'
  299. HELLO2:    CZ    SETSPC
  300.  
  301.     LXI    D,COLMSG
  302.     CALL    PRTLIN    ;
  303.     CALL    CHKYES    ; start comment
  304.     CPI    ESC
  305.     JZ    HELLO0
  306.     CPI    CTRLC
  307.     JZ    ABORT
  308.     CPI    'Y'
  309.     CZ    SETCOL    ; in column 25 ?
  310.  
  311.     LXI    D,EXCMSG
  312.     CALL    PRTLIN    ; Ignore exclamation point
  313.     CALL    CHKYES    ;  separator ?
  314.     CPI    ESC
  315.     JZ    HELLO0
  316.     CPI    CTRLC
  317.     JZ    ABORT
  318.     CPI    'Y'
  319.     CZ    SETNEX
  320.  
  321.     LXI    D,MLTMSG
  322.     CALL    PRTLIN    ; multiple statements
  323.     CALL    CHKYES    ; on one line ?
  324.     CPI    ESC
  325.     JZ    HELLO0
  326.     CPI    CTRLC
  327.     JZ    ABORT
  328.     CPI    'Y'
  329.     CZ    SETMLT
  330.  
  331.     LXI    D,TRNMSG ; Convert case ?
  332.     CALL    PRTLIN
  333.     CALL    CHKYES
  334.     CPI    ESC
  335.     JZ    HELLO0
  336.     CPI    CTRLC
  337.     JZ    ABORT
  338.     CPI    'L'
  339.     CZ    SETLC
  340.     CPI    'U'
  341.     CZ    SETUC
  342.  
  343.     MVI    A,N01
  344.     STA    COLNUM
  345.  
  346.     MVI    C,nCDISK
  347.     CALL    BDOS
  348.     INR    A
  349.     STA    xCDISK
  350.  
  351.     CALL    MAKFNS
  352.     CALL    OPENIN
  353.     CALL    CREATO
  354.     RET
  355. ;
  356. SIGNON    DB    '8080-to-8086 Translator version '
  357.     DB    VERS/100+'0','.',(VERS MOD 100)/10+'0'
  358.     DB    (VERS MOD 10)+'0'
  359.     DB    CR,LF,0
  360. ;
  361. ; Don't translate non-standard opcodes
  362. ;
  363. NXPSD:    XRA    A
  364.     STA    OPTTDL
  365.     STA    OPTENT
  366.     STA    OPTIFC
  367.     RET
  368.  
  369. DBMSG    DB    'Translate DB & EQU ? '
  370.     DB    '[Y/ret=N/esc/^C] ',0
  371. ;
  372. NXDBEQ:    XRA    A
  373.     STA    OPTBDB
  374.     RET
  375. ;
  376. SPCMSG    DB    'Use space (default TAB) after opcode ? '
  377.     DB    '[Y/ret=N/esc/^C] ',0
  378. ;
  379. SETSPC:    LXI    H,PUTHT+1
  380.     MVI    A,' '
  381.     MOV    M,A
  382.     STA    MLTSPC
  383.     RET
  384. ;
  385. COLMSG    DB    'Start comment in column 25 (default 33) ? '
  386.     DB    '[Y/ret=N/esc/^C] ',0
  387. ;
  388. SETCOL:    LXI    H,PUTND5+1
  389.     MVI    A,33
  390.     MOV    M,A
  391.     RET
  392. ;
  393. EXCMSG    DB    'Ignore ! statement separator ? '
  394.     DB    '[Y/ret=N/esc/^C] ',0
  395. ;
  396. SETNEX:    MVI    A,0C9H    ; RET instruction
  397.     STA    EXCLAM
  398.     RET
  399. ;
  400. MLTMSG    DB    'Put opcodes converted to multiple'
  401.     DB    ' statements on one line ? '
  402.     DB    '[Y/ret=N/esc/^C] ',0
  403. ;
  404. SETMLT:    LXI    H,EXCLSP
  405.     SHLD    SEPMSG
  406.     MVI    A,' '
  407.     STA    MLTSPC
  408.     RET
  409.  
  410. ;
  411. TRNMSG    DB    'Translate instructions to Upper/Lower'
  412.     DB    ' or preserve case ? [U/L/ret/esc/^C] ',0
  413. ;
  414. SETLC:    STA    TCASFL
  415.     STA    LCASFL
  416.     RET
  417. ;
  418. SETUC:    STA    TCASFL
  419.     RET
  420.  
  421. ;*******************************************************
  422. ;
  423. ;    Gets line from input file to line
  424. ;    buffer until CR.  Filters out ctrl
  425. ;    chars except for HT.  Truncates
  426. ;    lines after LBUFLN chars.
  427. ;    Terminates line with CR, LF, 0.
  428. ;
  429. GETLIN:    CALL    PDOT    ; print activity dot
  430.     CALL    CHKIN
  431.     CPI    CTRLC
  432.     JZ    JABORT
  433.     XRA    A
  434.     STA    QUOTFL    ; not in quote
  435.     STA    CMNTFL    ; not in comment
  436.     LXI    H,LBUFF    ;line buffer
  437.     MVI    B,LBUFLN ;max # of char
  438. GETLN1:    XCHG
  439.     LHLD    xIBUFF
  440.     XCHG
  441.  
  442.     MOV    A,D
  443.     CPI    (IBUFF+IBFLEN)/256
  444.     JNZ    GETLN4
  445.     MOV    A,E
  446.     CPI    (IBUFF+IBFLEN) MOD 256
  447.  
  448.     JNZ    GETLN4
  449.     PUSH    B
  450.     PUSH    H
  451.     LXI    D,IBUFF
  452. GETLN2:    MVI    C,nDMA
  453.     PUSH    D
  454.     CALL    BDOS
  455.     POP    D
  456.  
  457.     XCHG
  458.  
  459.     LXI    D,INFCB
  460.     MVI    C,nRDNR
  461.     PUSH    H
  462.     CALL    BDOS
  463.     POP    H
  464.     DCR    A
  465.     JNZ    GETLN3
  466.     MVI    A,EOF
  467.     MOV    M,A
  468. GETLN3:    LXI    D,RECLEN
  469.     DAD    D
  470.     XCHG
  471.     MOV    A,D
  472.     CPI    (IBUFF+IBFLEN)/256
  473.     JNZ    GETLN2
  474.     MOV    A,E
  475.     CPI    (IBUFF+IBFLEN) MOD 256
  476.     JNZ    GETLN2
  477.  
  478.     POP    H
  479.     POP    B
  480.     LXI    D,IBUFF
  481. GETLN4:    LDAX    D
  482.     INX    D
  483.     XCHG
  484.     SHLD    xIBUFF
  485.     XCHG
  486.     MOV    M,A
  487.  
  488.     CPI    QUOTE    ; set or reset
  489.     JNZ    GTLN41    ;  QUOTFL
  490.     LDA    QUOTFL
  491.     CMA
  492.     STA    QUOTFL
  493.  
  494. GTLN41:    MOV    A,M    ; Translate exclam.  pt.
  495.     CALL    EXCLAM    ;  which is not in quote
  496.     MOV    M,A    ;  to EOS
  497.  
  498.     LDA    TCASFL    ; translate to upper
  499.     ORA    A    ;  or lower case ?
  500.     JZ    GTLN46    ; NO
  501.  
  502.     LDA    QUOTFL    ; if in quote, do
  503.     ORA    A    ;  nothing
  504.     JNZ    GTLN43
  505.     MOV    A,M    ; otherwise, ';' sets
  506.     CPI    ';'    ;  CMNTFL and EOS resets
  507.     JZ    GTLN42    ;  it
  508.     CPI    EOS
  509.     JNZ    GTLN43
  510.     XRA    A
  511. GTLN42:    STA    CMNTFL
  512.  
  513. GTLN43:    LDA    QUOTFL    ; If in quote,
  514.     ORA    A    ;  do nothing
  515.     JNZ    GTLN46
  516.     LDA    CMNTFL    ; If in comment,
  517.     ORA    A    ;  do nothing
  518.     JNZ    GTLN46
  519.     LDA    LCASFL    ; Otherwise,
  520.     ORA    A    ;  if LCASFL set
  521.     MOV    A,M
  522.     JZ    GTLN44
  523.     CALL    LCASE    ;  trns to lwr case
  524.     JMP    GTLN45
  525. GTLN44:    CALL    UCASE    ;  else trns to upr case
  526. GTLN45:    MOV    M,A
  527.  
  528. GTLN46:    MOV    A,M
  529.     CPI    CR
  530.     JZ    GETLN6
  531.     CPI    HT    ; filters out all ctrl
  532.     JZ    GETLN5    ; chars except tab
  533.  
  534.     CPI    EOF
  535.     JZ    GETLN7
  536.     CPI    EOS
  537.     JZ    GETLN5
  538.  
  539.     CPI    ' '
  540.     JC    GETLN1
  541. GETLN5:    DCR    B
  542.     INX    H
  543.     JNZ    GETLN1
  544.     INR    B
  545.     DCX    H
  546.     JMP    GETLN1
  547. ;
  548. GETLN6:    INX    H
  549.     MVI    M,LF
  550.     INX    H
  551.     MVI    M,N00
  552.     XCHG
  553.     SHLD    xIBUFF
  554.     XCHG
  555.     RET
  556.  
  557. ;
  558. ;    Change exclamation point to EOS in A
  559. ;
  560. EXCLAM:    CPI    '!'
  561.     RNZ
  562.     LDA    QUOTFL
  563.     ORA    A
  564.     MVI    A,'!'
  565.     RNZ
  566.     MVI    A,EOS
  567.     RET
  568. ;
  569. QUOTFL    DB    0
  570. CMNTFL    DB    0
  571.  
  572. ;
  573. ;    Exit
  574. ;
  575. GETLN7:    CALL    CLOSEO
  576.     LXI    D,UPSMSG
  577.     CALL    PRTLIN
  578.     LXI    D,ENDIFL
  579.     CALL    PRTLIN
  580.     LXI    D,ICLFLG
  581.     CALL    PRTLIN
  582.     LXI    D,LSTFLG
  583.     CALL    PRTLIN
  584.     LXI    D,MACFLG
  585.     CALL    PRTLIN
  586.     LXI    D,EOJMSG
  587. ;
  588. ;    Print message at DE and abort
  589. ;
  590. EREXIT:    PUSH    D
  591.     LXI    D,CRLFMG
  592.     CALL    PRTLIN
  593.     POP    D
  594.     CALL    PRTLIN
  595.     JMP    ABORT
  596. ;
  597. JABORT:    LXI    D,JABTMG
  598.     CALL    PRTLIN
  599.     JMP    GETLN7
  600. ;
  601. JABTMG    DB    CR,LF,'*** Job Cancelled ***',CR,LF,0
  602. ;
  603. UPSMSG    DB    0,LF,'The following operands'
  604.     DB    ' have been used in your '
  605.     DB    'source and have not'
  606.     DB    CR,LF
  607.     DB    'been fully translated.  You must '
  608.     DB    'complete the translation using an editor.'
  609.     DB    CR,LF,HT
  610.     DB    'original:',HT,HT
  611.     DB    'must be translated to:'
  612.     DB    CR,LF,0
  613. ENDIFL    DB    0,'IF or IFC',HT,HT,'%IF(exp)THEN(txt1)',CR,LF
  614.     DB    HT,'ELSE',HT,HT,HT,'ELSE(txt2)',CR,LF
  615.     DB    HT,'ENDIF or #ENDIF',HT,HT,'FI'
  616.     DB    CR,LF,0
  617. ICLFLG    DB    0,'ICL'
  618.     DB    CR,LF,0
  619. LSTFLG    DB    0,'LST or LIST'
  620.     DB    CR,LF,0
  621. MACFLG    DB    0,'MACRO or MAC',HT,HT,'%DEFINE(mname[(plist)])'
  622.     DB    CR,LF
  623.     DB    HT,'#macro-call',HT,HT,'%macro-call'
  624.     DB    CR,LF,0
  625. ;
  626. EOJMSG    DB    '*** End of Job ***',CR,LF,0
  627.  
  628. ;*******************************************************
  629. ;
  630. ;    Process line
  631. ;
  632. PROCLIN:
  633.     LXI    H,LBUFF
  634. PROCLN0:
  635.     CALL    FNDOPC
  636.     JNZ    PRCLN00
  637.     CALL    PTCOLN    ; Put out pending colon
  638.     JMP    PUTND6
  639. PRCLN00:
  640.     LDA    COLNFL    ; is there a colon
  641.     ORA    A    ;  to print ?
  642.     JZ    PRCLN02    ; No, put white space
  643.  
  644.     LXI    H,OPTPSD ; See if opcode
  645.     LXI    B,OPBFLN ;  is DB, DW, DS, or EQU
  646.     CALL    SCANOP
  647.     MVI    A,' '
  648.     JZ    PRCLN01     ; If so, put space
  649.     MVI    A,':'     ;  otherwise, put colon
  650.  
  651. PRCLN01:
  652.     CALL    PUTCHR
  653.  
  654. PRCLN02:
  655.     LHLD    xWHITE
  656.     CALL    PUTSPT
  657.  
  658. PROCLN1:
  659.     LXI    H,OPTIMM ;imm or one byte
  660.     LXI    B,2*OPBFLN
  661.     CALL    SCANOP
  662.     JZ    DOIMM
  663.  
  664.     LXI    H,OPTONE ; one byte opcodes
  665.     LXI    B,2*OPBFLN
  666.     CALL    SCANOP
  667.     JZ    DO$ONE
  668.  
  669.     LXI    H,OPTREG ;register
  670.     LXI    B,2*OPBFLN
  671.     CALL    SCANOP
  672.     JZ    DOREG
  673.  
  674.     LXI    H,OPTBDB ; db and equ
  675.     LXI    B,2*OPBFLN
  676.     CALL    SCANOP
  677.     JZ    DOSIMP
  678.  
  679.     LXI    H,OPTSMP ; simple
  680.     LXI    B,2*OPBFLN
  681.     CALL    SCANOP
  682.     JZ    DOSIMP
  683.  
  684.     LXI    H,OPTROT ; rotates
  685.     LXI    B,2*OPBFLN
  686.     CALL    SCANOP
  687.     JZ    DOROT
  688.  
  689.     LXI    H,OPTDCR ; dcr, inr
  690.     LXI    B,2*OPBFLN
  691.     CALL    SCANOP
  692.     JZ    DODCR
  693.  
  694.     LXI    H,OPTDCX ;16 bit dcx, inx
  695.     LXI    B,2*OPBFLN
  696.     CALL    SCANOP
  697.     JZ    DODCX
  698.  
  699.     LXI    H,OPTTDL ;tdl
  700.     LXI    B,OPBFLN
  701.     CALL    SCANOP
  702.     CZ    DOTDL
  703.  
  704.     LXI    H,OPTRCC ;ret cond
  705.     LXI    B,2*OPBFLN
  706.     CALL    SCANOP
  707.     JZ    DORET
  708.  
  709.     LXI    H,OPTCCC ;call cond
  710.     LXI    B,2*OPBFLN
  711.     CALL    SCANOP
  712.     JZ    DOCALL
  713.  
  714.     LXI    H,OPTJCC ;jump cond
  715.     LXI    B,2*OPBFLN
  716.     CALL    SCANOP
  717.     JZ    DOJMP
  718.  
  719.     LXI    H,OPTMSC ;index & misc
  720.     LXI    B,2*OPBFLN+2
  721.     CALL    SCANOP
  722.     JZ    EXEC
  723.  
  724. PUTCOD:    LHLD    xOPCOD    ;this fix prevents macro
  725.     JMP    PUTEND    ;names from being split
  726.  
  727. PUTOPR:    LHLD    xOPRND
  728.  
  729. PUTEND:    XRA    A
  730.     STA    LCFLAG
  731.     STA    LCDFLG
  732.  
  733.     MVI    C,N00    ;  putout w/o
  734. PUTND1:    MOV    A,M    ;  change
  735.  
  736.     CPI    ' '
  737.     JZ    PUTND3
  738.     CPI    HT
  739.     JZ    PUTND3
  740.  
  741.     CPI    CR
  742.     JZ    PUTLNC
  743.  
  744.     CPI    ';'
  745.     JZ    PUTND4
  746.  
  747.     CPI    EOS    ; process exclamation pt.
  748.     JZ    PTND21    ;  statement separator
  749.  
  750.     CPI    QUOTE
  751.     JNZ    PUTND2
  752.     DCR    C
  753.     JZ    PUTND2
  754.     MVI    C,N01
  755. PUTND2:    CALL    PUTCHR
  756.     INX    H
  757.     JMP    PUTND1
  758.  
  759. ;
  760. PTND21:    CALL    SKSPHT
  761.     INX    H    ; Inc past excl. pt.
  762. PTND22:    MOV    A,M
  763.     CPI    ';'
  764.     JZ    PUTND5
  765.  
  766.     LDA    MLTLFL    ; Put out as separate
  767.     ORA    A    ;  lines
  768.     JZ    PTND24    ; NO
  769. ;
  770.     MOV    A,M
  771.     CPI    ' '    ; Change space to HT
  772.     JNZ    PTND23
  773.     MVI    M,HT
  774. PTND23:    CALL    PCRLF
  775.     JMP    PROCLN0
  776. ;
  777. PTND24:    LDA    TEMP    ; Was last character put
  778.     CPI    ' '    ;  out a space ?
  779.     JZ    PTND25
  780.     CPI    HT    ;  or a TAB ?
  781.     JZ    PTND25
  782.     MVI    A,' '    ; NO, put out a space
  783.     CALL    PUTCHR
  784. PTND25:    MVI    A,'!'
  785.     CALL    PUTCHR
  786.     JMP    PROCLN0
  787. ;
  788. ;
  789. PUTND3:    PUSH    H    ;Space or Tab come here
  790.     CALL    SKSPHT
  791.  
  792.     CPI    CR    ;this fix filters out
  793.     JZ    PUTLNB    ;trailing spaces or tabs
  794.     POP    H
  795.  
  796.     CPI    EOS    ; fix to process excl. pt.
  797.     JZ    PTND21
  798.  
  799.     CPI    ';'
  800.     MOV    A,M    ;prevent blank being replaced
  801.             ;by ';' in string data
  802.     JZ    PUTND4
  803.     CALL    PUTSPT
  804.     JMP    PUTND1
  805. ;
  806. PUTND4:    DCR    C    ;';' come here
  807.     INR    C
  808.     JNZ    PUTND2
  809.     CALL    SKSPHT
  810.  
  811. ; Tab comments to proper column
  812.  
  813. PUTND5:    MVI    B,41
  814. PTND51:    LDA    COLNUM
  815.     CMP    B    ;colnum>=41?
  816.     JNC    PTND54
  817.     DCR    A    ;no, insert
  818.     ANI    NF8    ;tabs to
  819.     ADI    N09    ;start output
  820.     CMP    B    ;at col. 33
  821.     JZ    PTND54
  822.     JC    PTND52
  823.     MVI    A,' '
  824.     JMP    PTND53
  825. ;
  826. PTND52:    MVI    A,HT
  827. PTND53:    CALL    PUTCHR
  828.     JMP    PTND51
  829.  
  830. PTND54:    LDA    TEMP    ; insure
  831.     CPI    ' '    ; space
  832.     JZ    PUTND6    ; before
  833.     CPI    HT    ; semi-colon
  834.     JZ    PUTND6    ;
  835.     MVI    A,' '    ;
  836.     CALL    PUTCHR    ;
  837. PUTND6:    MOV    A,M
  838.     INX    H
  839.     CPI    EOS
  840.     JZ    PTND22
  841.     ORA    A
  842.     RZ
  843.     CALL    PUTCHR
  844.     JMP    PUTND6
  845.  
  846. ;
  847. ;    Put line at HL to output file until 0
  848. ;    and reset colnum to 1.
  849. ;
  850. PUTLNB:    XTHL        ;filter trailing
  851.     POP    H    ;blanks or tabs
  852.  
  853. PUTLNC:    JMP    PUTLIN
  854.  
  855. ;*******************************************************
  856. ;
  857. ;    Process labels, find potential opcode.
  858. ;
  859. FNDOPC:    XRA    A
  860.     STA    COLNFL    ; Reset colon flag
  861.  
  862.     MOV    A,M
  863.     CPI    ' '
  864.     JZ    FNDOP3
  865.     CPI    HT
  866.     JZ    FNDOP3
  867.  
  868.     CPI    CR    ;pass blank
  869.     RZ        ;lines
  870.     CPI    EOS    ; excl. pt. separator
  871.     RZ
  872.  
  873.     CPI    ';'
  874.     RZ
  875.  
  876.     CPI    '*'    ; asterisk in first column
  877.     JNZ    FNDOP1    ; is a comment line
  878.     MVI    M,';'
  879.     RET
  880. ;
  881. ; Only comes here if this is a label
  882. ;
  883. FNDOP1:    MVI    C,N00
  884.     MVI    A,':'    ; Set colon flag
  885.     STA    COLNFL    ;  to insure colon after label
  886.  
  887. FNDOP2:    MOV    A,M
  888.  
  889.     CPI    ':'
  890.     JZ    FNDOP4
  891.  
  892.     CPI    HT
  893.     JZ    FNDOP6
  894.     CPI    ' '
  895.     JZ    FNDOP6
  896.  
  897.     CPI    CR
  898.     RZ
  899.     CPI    EOS
  900.     RZ
  901.  
  902.     CPI    ';'
  903.     JZ    FNDP72
  904.  
  905.     CALL    PUTCHR
  906.     INX    H
  907.     INR    C
  908.     JMP    FNDOP2
  909.  
  910. ; Comes here only if space or tab at beginning
  911. ; of line.
  912.  
  913. FNDOP3:
  914.     PUSH    H
  915.     CALL    SKSPHT    ;find first non-sp or tab
  916.     CPI    CR
  917.     JZ    FNDOP9
  918.     CPI    EOS
  919.     JZ    FNDOP9
  920.     CPI    ';'
  921.     JZ    FNDP71
  922.     POP    H
  923.  
  924.     CALL    PUTSPT    ;print until non-sp or ht
  925.     PUSH    H
  926.     CALL    FINDLM    ;find ,:+-/*); CR HT or SP at HL
  927.     CPI    ':'
  928.     POP    H
  929.     JZ    FNDOP1
  930.     JMP    FNDOP7
  931. ;
  932. ; Colon terminating label comes here
  933. ;
  934. FNDOP4:    INX    H
  935.     MOV    A,M
  936.     CPI    ':'
  937.     JNZ    FNDOP5
  938.     CALL    PUTCHR
  939.     INX    H
  940. FNDOP5:    MVI    A,':'
  941.     STA    COLNFL    ; Set colon flag
  942. ;
  943. ; HT or SP comes here
  944. ;
  945. FNDOP6:
  946. ;
  947. ; See if there is an opcode field
  948. ;
  949. FNDOP7:    PUSH    H
  950.  
  951.     CALL    SKSPHT
  952.     MOV    A,M
  953.  
  954.     CPI    CR
  955.     JZ    FNDOP9    ; filter trailing SP or TAB
  956.     CPI    EOS
  957.     JZ    FNDOP9    ; excl. pt. separator
  958.  
  959.     CPI    ';'
  960.     JNZ    FNDOP8
  961.  
  962. FNDP71:    XTHL
  963.     POP    H
  964. FNDP72:    POP    B    ; clear return
  965.     CALL    PTCOLN    ; Put colon out if flag set
  966.     JMP    PUTND5    ; tab to proper column
  967. ;
  968. ; Have located opcode field
  969. ;
  970. FNDOP8:    POP    H
  971.     SHLD    xWHITE
  972.     CALL    SKSPHT
  973.  
  974. ;    Move potential opcode to OPCBUF
  975.  
  976. MOVOPC:    SHLD    xOPCOD
  977.     MVI    B,OPBFLN
  978.     LXI    D,OPCBUF
  979.     CALL    MOVBDH    ; move up to B char from HL to
  980.     CALL    SKSPHT    ; DE until ,:+-/*); CR HT SP
  981.     SHLD    xOPRND
  982.     SUB    A
  983.     INR    A
  984.     RET
  985.  
  986. ; come here on CR to filter trailing SP or TAB
  987.  
  988. FNDOP9:    CALL    PTCOLN    ; Put out colon if flag set
  989.     XTHL
  990.     POP    H
  991.     XRA    A
  992.     RET
  993.  
  994. ;
  995. ;    Put colon to output file if colon
  996. ;    flag is set.
  997. ;
  998. PTCOLN:    LDA    COLNFL
  999.     ORA    A
  1000.     RZ
  1001.  
  1002.     CALL    PUTCHR
  1003.     XRA    A
  1004.     STA    COLNFL
  1005.     RET
  1006. ;
  1007. COLNFL    DB    0
  1008. xWHITE    DW    0    ; pointer to white space after
  1009.             ;  label and before opcode
  1010.  
  1011. ;*******************************************************
  1012. ;
  1013. ;    Opcode tables
  1014. ;
  1015. OPTIMM    DB    'ACI  ADC  '
  1016.     DB    'ADI  ADD  '
  1017.     DB    'ANI  AND  '
  1018.     DB    'CPI  CMP  '
  1019.     DB    'ORI  OR   '
  1020.     DB    'SBI  SBB  '
  1021.     DB    'SUI  SUB  '
  1022.     DB    'XRI  XOR  '
  1023.     DB    0
  1024.  
  1025. OPTONE    DB    'RET  RET  '
  1026.     DB    'CMC  CMC  '
  1027.     DB    'HLT  HLT  '
  1028.     DB    'STC  STC  '
  1029.     DB    'DAA  DAA  '
  1030.     DB    'DI   CLI  '
  1031.     DB    'EI   STI  '
  1032.     DB    'NOP  NOP  '
  1033.     DB    0
  1034.  
  1035. OPTREG    DB    'ADC  ADC  '
  1036.     DB    'ADD  ADD  '
  1037.     DB    'ANA  AND  '
  1038.     DB    'CMP  CMP  '
  1039.     DB    'ORA  OR   '
  1040.     DB    'SBB  SBB  '
  1041.     DB    'SUB  SUB  '
  1042.     DB    'XRA  XOR  '
  1043.     DB    0
  1044.  
  1045. OPTPSD    DB    'DB   '
  1046.     DB    'EQU  '
  1047.     DB    'DW   '
  1048.     DB    'DS   '
  1049.     DB    0
  1050.  
  1051. OPTBDB    DB    'DB   DB   '
  1052.     DB    'EQU  EQU  '
  1053.     DB    0
  1054.  
  1055. OPTSMP    DB    'JMP  JMP  '
  1056.     DB    'CALL CALL '
  1057.     DB    'DS   RS   '
  1058.     DB    'DW   DW   '
  1059.     DB    'SET  EQU  '
  1060. OPTENT    DB    'ENT  ENTRY'
  1061.     DB    'NAM  NAME '
  1062.     DB    'RAM  DATA '
  1063.     DB    'ROG  REL  '
  1064.     DB    0
  1065.  
  1066. OPTDCR    DB    'DCR  DEC  '
  1067.     DB    'INR  INC  '
  1068.     DB    0
  1069.  
  1070. OPTROT    DB    'RAL  RCL  '
  1071.     DB    'RAR  RCR  '
  1072.     DB    'RLC  ROL  '
  1073.     DB    'RRC  ROR  '
  1074.     DB    0
  1075.  
  1076. OPTDCX    DB    'DCX  DEC  '
  1077.     DB    'INX  INC  '
  1078.     DB    0
  1079.  
  1080. OPTTDL    DB    'REQ  '
  1081.     DB    'RNE  '
  1082.     DB    'RLT  '
  1083.     DB    'RGE  '
  1084.     DB    'CEQ  '
  1085.     DB    'CNE  '
  1086.     DB    'CLT  '
  1087.     DB    'CGE  '
  1088.     DB    'JEQ  '
  1089.     DB    'JNE  '
  1090.     DB    'JLT  '
  1091.     DB    'JGE  '
  1092.     DB    0
  1093.  
  1094. OPTRCC    DB    'RC   JNC  '
  1095.     DB    'RNC  JC   '
  1096.     DB    'RZ   JNZ  '
  1097.     DB    'RNZ  JZ   '
  1098.     DB    'RP   JS   '
  1099.     DB    'RM   JNS  '
  1100.     DB    'RPE  JPO  '
  1101.     DB    'RPO  JPE  '
  1102.     DB    0
  1103.  
  1104. OPTCCC    DB    'CC   JNC  '
  1105.     DB    'CNC  JC   '
  1106.     DB    'CZ   JNZ  '
  1107.     DB    'CNZ  JZ   '
  1108.     DB    'CP   JS   '
  1109.     DB    'CM   JNS  '
  1110.     DB    'CPE  JPO  '
  1111.     DB    'CPO  JPE  '
  1112.     DB    0
  1113.  
  1114. OPTJCC    DB    'JC   JNC  '
  1115.     DB    'JNC  JC   '
  1116.     DB    'JZ   JNZ  '
  1117.     DB    'JNZ  JZ   '
  1118.     DB    'JP   JS   '
  1119.     DB    'JM   JNS  '
  1120.     DB    'JPE  JPO  '
  1121.     DB    'JPO  JPE  '
  1122.     DB    0
  1123.  
  1124. OPTMSC    DB    'LXI  MOV  '
  1125.     DW    DOLXI
  1126.     DB    'POP  POP  '
  1127.     DW    DOPOP
  1128.     DB    'PUSH PUSH '
  1129.     DW    DOPSH
  1130.     DB    'DAD  ADD  '
  1131.     DW    DODAD
  1132.     DB    'LDA  MOV  '
  1133.     DW    DOLDA
  1134.     DB    'LDAX MOV  '
  1135.     DW    DOLDAX
  1136.     DB    'LHLD MOV  '
  1137.     DW    DOLHLD
  1138.     DB    'MOV  MOV  '
  1139.     DW    DOMOV
  1140.     DB    'MVI  MOV  '
  1141.     DW    DOMVI
  1142.     DB    'IN   IN   '
  1143.     DW    DOIN
  1144.     DB    'OUT  OUT  '
  1145.     DW    DOOUT
  1146.     DB    'PCHL JMP  '
  1147.     DW    DOPCHL
  1148.     DB    'RST  CALL '
  1149.     DW    DORST
  1150.     DB    'SHLD MOV  '
  1151.     DW    DOSHLD
  1152.     DB    'SPHL MOV  '
  1153.     DW    DOSPHL
  1154.     DB    'STA  MOV  '
  1155.     DW    DOSTA
  1156.     DB    'STAX MOV  '
  1157.     DW    DOSTAX
  1158.     DB    'XCHG XCHG '
  1159.     DW    DOXCHG
  1160.     DB    'XTHL XCHG '
  1161.     DW    DOXTHL
  1162.     DB    'CMA  NOT  '
  1163.     DW    DOCMA
  1164.     DB    'IF   IF   '
  1165.     DW    DOIFC
  1166.     DB    'LIST LIST '
  1167.     DW    DOLST
  1168.     DB    'MACROMACRO'
  1169.     DW    DOMAC
  1170. OPTIFC    DB    'IFC  IF   '
  1171.     DW    DOIFC
  1172.     DB    'ICL  *INCL'
  1173.     DW    DOICL
  1174.     DB    'LST  LIST '
  1175.     DW    DOLST
  1176.     DB    'MAC  MACRO'
  1177.     DW    DOMAC
  1178.     DB    0
  1179.  
  1180. ;*******************************************************
  1181. ;
  1182. ;    Scan table at HL for match to OPBFLN
  1183. ;    char string at OPCBUF.
  1184. ;    Ret Z and HL-> entry if match.
  1185. ;
  1186. SCANOP:    MOV    A,M
  1187.     ANA    A
  1188.     JZ    SCNOP1
  1189.     PUSH    B
  1190.     MVI    B,OPBFLN
  1191.     LXI    D,OPCBUF
  1192.     CALL    CBDEHL    ;comp B bytes (DE)-(HL)
  1193.     POP    B
  1194.     RZ
  1195.     DAD    B
  1196.     JMP    SCANOP
  1197. ;
  1198. SCNOP1:    INR    A
  1199.     RET
  1200.  
  1201. ;
  1202. ;    Gets routine address  from
  1203. ;    HL+2*OPBFLN and jumps to routine.
  1204. ;
  1205. EXEC:    PUSH    H
  1206.     LXI    B,2*OPBFLN
  1207.     DAD    B
  1208.     MOV    C,M
  1209.     INX    H
  1210.     MOV    B,M
  1211.     POP    H
  1212.     PUSH    B    ;address on stack
  1213.     RET        ;go to it
  1214.  
  1215. ;
  1216. ;    Put up to OPBFLN char at HL+OPBFLN
  1217. ;    to output file.  Stop at space,
  1218. ;    and put tab to output file.
  1219. ;
  1220. PUTOPHT:
  1221.     CALL    PUTOPC
  1222. PUTHT:    MVI    A,HT
  1223.     JMP    PUTCHR
  1224.  
  1225. ;
  1226. ;    Put space or tab (contents of MLTSPC)
  1227. ;    to output file as separator after opcode
  1228. ;    in multi-statement output line.
  1229. ;
  1230. PUTHTS:    LDA    MLTSPC
  1231.     JMP    PUTCHR
  1232. ;
  1233. MLTSPC    DB    HT
  1234.  
  1235. ;
  1236. ;
  1237. ;
  1238. PUTOPC:    LXI    B,OPBFLN
  1239.     DAD    B    ; HL -> new opcode
  1240.     MOV    B,C
  1241. PUTOP1:    MOV    A,M
  1242.  
  1243.     CPI    ' '
  1244.     RZ
  1245.  
  1246.     CPI    HT
  1247.     RZ
  1248.  
  1249.     LDA    LCFLAG
  1250.     ORA    A
  1251.     MOV    A,M
  1252.     JZ    PUTOP2
  1253.     ORI    20H
  1254. PUTOP2:
  1255.     CALL    PUTCHR
  1256.     INX    H
  1257.     DCR    B
  1258.     JNZ    PUTOP1
  1259.  
  1260.     RET
  1261.  
  1262. ;
  1263. ;    Put string at HL to output file until 0.
  1264. ;    If (LCFLAG) set, convert to lower case.
  1265. ;
  1266. PUTOPS:    MOV    A,M
  1267.     ORA    A
  1268.     RZ
  1269.     LDA    LCFLAG
  1270.     ORA    A
  1271.     MOV    A,M
  1272.     JZ    PUTOS0
  1273.     CALL    LCASE
  1274. PUTOS0:    CALL    PUTCHR
  1275.     INX    H
  1276.     JMP    PUTOPS
  1277.  
  1278. ;
  1279. ;    Put string at HL to output file until 0.
  1280. ;    If (LCDFLG) set, convert to lower case.
  1281. ;
  1282. PUTRND:    MOV    A,M
  1283.     ORA    A
  1284.     RZ
  1285.     LDA    LCDFLG
  1286.     ORA    A
  1287.     MOV    A,M
  1288.     JZ    PUTRN0
  1289.     CALL    LCASE
  1290. PUTRN0:    CALL    PUTCHR
  1291.     INX    H
  1292.     JMP    PUTRND
  1293. ;
  1294. LCDFLG    DB    0
  1295.  
  1296. ;
  1297. ;    Find first ,:+-/*); CR HT or SP at HL,
  1298. ;    return A = (HL).
  1299. ;
  1300. FINDLM:    PUSH    B
  1301.     CALL    CHKDLM
  1302.     POP    B
  1303.     RZ
  1304.     INX    H
  1305.     JMP    FINDLM
  1306. ;
  1307. ;    Fill B locations at DE with spaces.
  1308. ;    Move up to B char from HL to DE until
  1309. ;    ,:+-/*); CR HT or SP encountered.
  1310. ;    Return Z and HL->special char if found.
  1311. ;    (search B+1 loc for special char.)
  1312. ;
  1313. MOVBDH:    MOV    C,B
  1314.     MVI    B,N00
  1315.     PUSH    B
  1316.     PUSH    D
  1317.     PUSH    H    ; fill BC locations
  1318.     CALL    FILLBD    ; at DE with spaces
  1319.     POP    H    ;
  1320.     POP    D
  1321.     POP    B
  1322. MOVBD1:    PUSH    B    ; ret Z, A=(HL)
  1323.     CALL    CHKDLM    ; if (HL) is
  1324.     POP    B    ; ,:+-/*); CR HT or SP
  1325.     RZ
  1326.  
  1327.     MOV    A,M
  1328.     STAX    D
  1329.     INX    D
  1330.     INX    H
  1331.     DCX    B
  1332.     MOV    A,B
  1333.     ORA    C
  1334.     JZ    CHKDLM
  1335.     JMP    MOVBD1
  1336.  
  1337. ;
  1338. ;    Skip spaces and tabs.
  1339. ;    Return HL -> non-space or non-tab
  1340. ;
  1341. SKSPHT:    MOV    A,M
  1342.     CPI    ' '
  1343.     JZ    SKSPT1
  1344.     CPI    HT
  1345.     RNZ
  1346. SKSPT1:    INX    H
  1347.     JMP    SKSPHT
  1348.  
  1349. ;
  1350. ;    Ret Z, A=(HL) if
  1351. ;    HL is ,:+-/*); CR HT SP or EOS
  1352. ;
  1353. CHKDLM:    MOV    A,M
  1354.     CPI    HT
  1355.     RZ
  1356.     CPI    ' '
  1357.     RZ
  1358.     CPI    ','
  1359.     RZ
  1360.     CPI    ';'
  1361.     RZ
  1362.     CPI    CR
  1363.     RZ
  1364.     CPI    ':'
  1365.     RZ
  1366.     CPI    '+'
  1367.     RZ
  1368.     CPI    '-'
  1369.     RZ
  1370.     CPI    '/'
  1371.     RZ
  1372.     CPI    '*'
  1373.     RZ
  1374.     CPI    ')'
  1375.     RZ
  1376.     CPI    EOS
  1377.     RET
  1378. ;
  1379. ;    Compares B chars at DE with chars
  1380. ;    at HL.
  1381. ;    Ret Z if match.
  1382. ;    Preserve HL, DE, BC
  1383. ;
  1384. CBDEHL:    PUSH    H
  1385.     PUSH    D
  1386.     PUSH    B
  1387. CBDH1:    LDAX    D
  1388.  
  1389.     CPI    'a'
  1390.     JC    CBDH2
  1391.     STA    LCFLAG
  1392.     ANI    05FH
  1393. CBDH2:
  1394.     CMP    M
  1395.     JNZ    CBDH3
  1396.     INX    H
  1397.     INX    D
  1398.     DCR    B
  1399.     JNZ    CBDH1
  1400. CBDH3:    POP    B
  1401.     POP    D
  1402.     POP    H
  1403.     RET
  1404.  
  1405. LCFLAG    DB    0
  1406.  
  1407. ;
  1408. ;    Fill BC locations starting at
  1409. ;    DE with spaces.
  1410. ;    Returns A = space, DE -> next free
  1411. ;    location, HL = DE - 1, BC = 0.
  1412. ;
  1413. FILLBD:    MVI    A,' '
  1414.     STAX    D
  1415.     MOV    H,D
  1416.     MOV    L,E
  1417.     INX    D
  1418.     DCX    B
  1419.     CALL    MOVIR
  1420.     RET
  1421.  
  1422. ;
  1423. ;    Subtract DE from HL, result in HL.
  1424. ;
  1425. SBCHLDE:
  1426.     MOV    A,L
  1427.     SUB    E
  1428.     MOV    L,A
  1429.     MOV    A,H
  1430.     SBB    D
  1431.     MOV    H,A
  1432.     RET
  1433.  
  1434. ;
  1435. ;    (DE)=(HL), INC HL, INC DE, DEC BC
  1436. ;    Repeat until BC = 0.
  1437. ;
  1438. MOVIR:    MOV    A,M
  1439.     STAX    D
  1440.     INX    H
  1441.     INX    D
  1442.     DCX    B
  1443.     MOV    A,B
  1444.     ORA    C
  1445.     JNZ    MOVIR
  1446.     RET
  1447.  
  1448. ;*******************************************************
  1449. ;
  1450. ;    Translation Routines
  1451. ;
  1452. ;*******************************************************
  1453.  
  1454. ;
  1455. ;    Immediate
  1456. ;    e.g., CPI n -> CMP AL,n
  1457. ;
  1458. DOIMM:    CALL    PUTOPHT
  1459.     LXI    H,OPALC
  1460.     CALL    PUTOPS
  1461.     JMP    PUTOPR
  1462. ;
  1463. OPALC    DB    'AL,',0
  1464.  
  1465. ;
  1466. ;    One byte (implied)
  1467. ;    e.g., DI -> CLI
  1468. ;
  1469. DO$ONE:    CALL    PUTOPC
  1470.     JMP    PUTOPR
  1471.  
  1472. ;
  1473. ; Simple translation
  1474. ; e.g., DS n -> RS n
  1475. ;
  1476. DOSIMP:    CALL    PUTOPHT
  1477.     JMP    PUTOPR
  1478.  
  1479. ;
  1480. ;    Register instructions,
  1481. ;    e.g., XRA r -> XOR AL,r'
  1482. ;
  1483. DOREG:    CALL    PUTOPHT    ; Put out opcode+tab
  1484.     LXI    H,OPALC    ; Put out 'AL,'
  1485.     CALL    PUTOPS
  1486.     LHLD    xOPRND
  1487.     CALL    TRNRG    ; Translate register
  1488.     JNZ    PUTEND
  1489.     XCHG        ; Get HL -> r'
  1490.     CALL    PUTRND
  1491.     XCHG
  1492.     JMP    PUTEND
  1493.  
  1494. ;
  1495. ;    MOV r,s -> MOV r',s'
  1496. ;
  1497. DOMOV:    CALL    PUTOPHT
  1498.  
  1499.     LHLD    xOPRND
  1500.     CALL    TRNRG
  1501.     JNZ    PUTOPR
  1502.  
  1503.     XCHG
  1504.     CALL    PUTRND
  1505.     XCHG
  1506.  
  1507.     XRA    A
  1508.     STA    LCDFLG    ; Clear lower case flag
  1509.     MOV    A,M    ; Get comma
  1510.     INX    H    ; Inc past ','
  1511.     CALL    PUTCHR
  1512.  
  1513.     CALL    TRNRG
  1514.     JNZ    PUTEND
  1515.  
  1516.     XCHG
  1517.     CALL    PUTRND
  1518.     XCHG
  1519.     JMP    PUTEND
  1520.  
  1521. ;
  1522. ; Dec and Inc byte register
  1523. ;    DCR r -> DEC r'
  1524. ;
  1525. DODCR:
  1526.  
  1527. ;
  1528. ;    MVI r,n -> MOV r',n
  1529. ;
  1530. DOMVI:    CALL    PUTOPHT
  1531.  
  1532.     LHLD    xOPRND
  1533.     CALL    TRNRG
  1534.     JNZ    PUTEND
  1535.  
  1536.     LDAX    D
  1537.     CPI    '['
  1538.     JNZ    DOMVI1
  1539.  
  1540.     PUSH    H
  1541.     LXI    H,OPBYTP
  1542.     CALL    PUTLIN
  1543.     POP    H
  1544.  
  1545. DOMVI1:    XCHG
  1546.     CALL    PUTRND
  1547.     XCHG
  1548.     JMP    PUTEND
  1549. ;
  1550. OPBYTP    DB    'BYTE PTR ',0
  1551.  
  1552. ;
  1553. ; Translate 8080 byte registers to
  1554. ; 8086 byte registers.
  1555. ; Enter with HL -> to 8080 register.
  1556. ; If match,
  1557. ;  return Z set, HL -> next, DE -> translation,
  1558. ; Otherwise,
  1559. ;  return NZ, HL, DE unchanged.
  1560. ;
  1561. TRNRG:    MOV    A,M
  1562.     CPI    'a'
  1563.     JC    TRNRG2
  1564.     STA    LCDFLG
  1565. TRNRG2:    ANI    5FH
  1566.     PUSH    H
  1567.     LXI    H,RTBL
  1568.     MVI    B,RTBLE-RTBL
  1569. TRNRG3:    CMP    M
  1570.     JZ    TRNRG4
  1571.     INX    H
  1572.     DCR    B
  1573.     JNZ    TRNRG3
  1574.     POP    H    ; HL -> r
  1575.     MVI    A,0FFH    ; return NZ
  1576.     ORA    A    ; if no match
  1577.     RET
  1578. ;
  1579. TRNRG4:    LXI    D,RTBL
  1580.     CALL    SBCHLDE
  1581.     DAD    H
  1582.     LXI    D,RPTBL
  1583.     DAD    D
  1584.     MOV    E,M
  1585.     INX    H
  1586.     MOV    D,M
  1587.     POP    H
  1588.     INX    H    ; point to next
  1589.     XRA    A    ; return Z
  1590.     RET
  1591. ;
  1592. RTBL    DB    'ABCDEHLM'
  1593. RTBLE:
  1594. RPTBL    DW    ALREG
  1595.     DW    CHREG
  1596.     DW    CLREG
  1597.     DW    DHREG
  1598.     DW    DLREG
  1599.     DW    BHREG
  1600.     DW    BLREG
  1601.     DW    PBX
  1602. ;
  1603. ALREG    DB    'AL',0
  1604. CHREG    DB    'CH',0
  1605. CLREG    DB    'CL',0
  1606. DHREG    DB    'DH',0
  1607. DLREG    DB    'DL',0
  1608. BHREG    DB    'BH',0
  1609. BLREG    DB    'BL',0
  1610. PBX    DB    '[BX]',0
  1611.  
  1612. ;
  1613. ; Rotates
  1614. ;
  1615. DOROT:    CALL    PUTOPHT
  1616.     LXI    H,OPALC    ; 'AL,'
  1617.     CALL    PUTOPS
  1618.     MVI    A,'1'
  1619.     CALL    PUTCHR
  1620.     JMP    PUTOPR
  1621.  
  1622. ;
  1623. ;    DAD rp -> ADD BX,rp'
  1624. ;
  1625. DODAD:    LDA    DADFL
  1626.     ORA    A
  1627.     JZ    DODAD1
  1628.  
  1629.     PUSH    H
  1630.     LXI    H,OPPSHF ;'PUSHF'
  1631.     CALL    PUTOPS
  1632.     CALL    SEP     ; separator
  1633.     POP    H
  1634.  
  1635.     CALL    PUTOPC
  1636.     CALL    PUTHTS    ; Put out space or tab
  1637.     JMP    DODAD2
  1638.  
  1639. DODAD1:    CALL    PUTOPHT
  1640.  
  1641. DODAD2:    LXI    H,OPBXC    ;'BX,'
  1642.     CALL    PUTOPS
  1643.  
  1644.     LHLD    xOPRND
  1645.     CALL    TRNRP    ; DE -> translated rp
  1646.     JNZ    PUTOPR
  1647.     LDAX    D
  1648.     CPI    'A'
  1649.     JZ    PUTOPR
  1650.  
  1651.     XCHG        ; HL -> translated rp
  1652.     CALL    PUTRND
  1653.     XCHG        ; HL -> next
  1654.  
  1655.     LDA    DADFL
  1656.     ORA    A
  1657.     JZ    PUTEND
  1658.  
  1659.     PUSH    H
  1660.     CALL    SEP     ; Separator
  1661.     LXI    H,OPPOPF ; 'POPF'
  1662.     CALL    PUTOPS
  1663.     POP    H
  1664.  
  1665.     JMP    PUTEND
  1666. ;
  1667. OPBXC    DB    'BX,',0
  1668.  
  1669. ;
  1670. ;    DCX or INX rp -> DEC or INC rp'
  1671. ;
  1672. DODCX:    LDA    INXFL    ; If set, output
  1673.     ORA    A    ;  PUSHF to preserve
  1674.     JZ    DODCX1    ;  flags
  1675.  
  1676.     PUSH    H
  1677.     LXI    H,OPPSHF ;'PUSHF'
  1678.     CALL    PUTOPS
  1679.     CALL    SEP     ; separator
  1680.     POP    H
  1681.  
  1682.     CALL    PUTOPC
  1683.     CALL    PUTHTS    ; Put out space or tab
  1684.     JMP    DODCX2
  1685.  
  1686. DODCX1:    CALL    PUTOPHT
  1687.  
  1688. DODCX2:    LHLD    xOPRND
  1689.     CALL    TRNRP    ; DE -> translated rp
  1690.     JNZ    PUTOPR
  1691.     LDAX    D
  1692.     CPI    'A'
  1693.     JZ    PUTOPR
  1694.  
  1695.     XCHG        ; HL -> translated rp
  1696.     CALL    PUTRND
  1697.     XCHG        ; HL -> next
  1698.  
  1699.     LDA    INXFL    ; If set, output
  1700.     ORA    A    ;  POPF to preserve
  1701.     JZ    PUTEND    ;  flags
  1702.  
  1703.     PUSH    H
  1704.     CALL    SEP     ; Separator
  1705.     LXI    H,OPPOPF ; 'POPF'
  1706.     CALL    PUTOPS
  1707.     POP    H
  1708.  
  1709.     JMP    PUTEND
  1710. ;
  1711. OPPSHF    DB    'PUSHF',0
  1712. OPPOPF    DB    'POPF',0
  1713.  
  1714. ;
  1715. ; PUSH rp -> PUSH rp'
  1716. ;
  1717. DOPSH:    XCHG
  1718.     LHLD    xOPRND
  1719.     MOV    A,M
  1720.     ANI    5FH
  1721.     CPI    'P'
  1722.     XCHG
  1723.     JNZ    DOPSH1
  1724.     XCHG
  1725.     CALL    TRNRP    ; DE -> trans, HL -> next
  1726.     JNZ    PUTCOD
  1727.     PUSH    H
  1728.     LXI    H,OPLAHF
  1729.     CALL    PUTRND
  1730.  
  1731.     LDA    PSWFL    ; Preserve order of
  1732.     ORA    A    ;  registers on stack ?
  1733.     CNZ    XAHAL    ; Yes,  XCHG AH,AL
  1734.  
  1735.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  1736.     LXI    H,OPPUSH
  1737.     CALL    PUTOPS
  1738.     CALL    PUTHTS
  1739.     POP    H
  1740.     XCHG        ; HL -> translated rp
  1741.     CALL    PUTRND
  1742.     XCHG        ; HL -> next
  1743.  
  1744.     LDA    PSWFL
  1745.     ORA    A
  1746.     CNZ    XAHAL
  1747.  
  1748.     JMP    PUTEND
  1749. ;
  1750. DOPSH1:    CALL    PUTOPHT
  1751. DOPSH2:    LHLD    xOPRND
  1752.     CALL    TRNRP    ; DE -> translated rp
  1753.     JNZ    PUTOPR
  1754. DOPSH3:    XCHG        ; HL -> translated rp
  1755.     CALL    PUTRND
  1756.     XCHG        ; HL -> next
  1757.     JMP    PUTEND
  1758. ;
  1759. OPLAHF    DB    'LAHF',0
  1760. OPPUSH    DB    'PUSH',0
  1761.  
  1762. ;
  1763. XAHAL:    PUSH    H
  1764.     CALL    SEP
  1765.     LXI    H,OPXCHG
  1766.     CALL    PUTRND
  1767.     CALL    PUTHTS
  1768.     LXI    H,OPAHAL
  1769.     CALL    PUTRND
  1770.     POP    H
  1771.     RET
  1772. ;
  1773. OPXCHG    DB    'XCHG',0
  1774. OPAHAL    DB    'AH,AL',0
  1775.  
  1776. ;
  1777. ; POP rp -> POP rp'
  1778. ;
  1779. DOPOP:    XCHG
  1780.     LHLD    xOPRND
  1781.     MOV    A,M
  1782.     ANI    5FH
  1783.     CPI    'P'
  1784.     XCHG
  1785.     JNZ    DOPSH1
  1786.  
  1787.     CALL    PUTOPC
  1788.     CALL    PUTHT    ; Put out space or tab
  1789.  
  1790.     LHLD    xOPRND
  1791.     CALL    TRNRP    ; DE -> trans, HL -> next
  1792.     JNZ    PUTOPR
  1793.  
  1794.     XCHG
  1795.     CALL    PUTRND
  1796.  
  1797.     LDA    PSWFL
  1798.     ORA    A
  1799.     CNZ    XAHAL
  1800.  
  1801.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  1802.     LXI    H,OPSAHF
  1803.     CALL    PUTRND
  1804.     XCHG
  1805.     JMP    PUTEND
  1806. ;
  1807. OPSAHF    DB    'SAHF',0
  1808.  
  1809. ;
  1810. ; LXI rp,nn -> MOV rp',OFFSET nn
  1811. ;
  1812. DOLXI:    CALL    PUTOPHT
  1813.     LHLD    xOPRND
  1814.     CALL    TRNRP
  1815.     JNZ    PUTOPR
  1816.     LDAX    D
  1817.     CPI    'A'
  1818.     JZ    PUTOPR
  1819.     XCHG
  1820.     CALL    PUTRND
  1821.     LXI    H,OFFATR
  1822.     CALL    PUTLIN
  1823.     XCHG        ; HL -> next
  1824.     INX    H    ; skip comma
  1825.     JMP    PUTEND
  1826. ;
  1827. OFFATR    DB    ',OFFSET ',0
  1828.  
  1829. ;
  1830. ; Translate 16 bit registers.
  1831. ; Enter with HL -> rp.
  1832. ; Returns HL -> next char, DE -> translation,
  1833. ; Z set if match,
  1834. ; otherwise, HL unchanged, NZ.
  1835. ;
  1836. TRNRP:    XRA    A
  1837.     STA    LCDFLG
  1838.     MOV    A,M
  1839.     CPI    'a'
  1840.     JC    TRNRP1
  1841.     STA    LCDFLG
  1842. TRNRP1:    ANI    5FH
  1843.     CPI    'B'
  1844.     JZ    TRNRPB
  1845.     CPI    'D'
  1846.     JZ    TRNRPD
  1847.     CPI    'H'
  1848.     JZ    TRNRPH
  1849.     CPI    'P'
  1850.     JZ    TRNRPP
  1851.     CPI    'S'
  1852.     JZ    TRNRPS
  1853. TRNRP2:    MVI    A,0
  1854.     STA    LCDFLG
  1855.     RET
  1856.  
  1857. ;
  1858. TRNRPB:    LXI    D,OPRCX    ;'CX'
  1859.     INX    H
  1860.     RET
  1861. ;
  1862. TRNRPD:    LXI    D,OPRDX    ;'DX'
  1863.     INX    H
  1864.     RET
  1865. ;
  1866. TRNRPH:    LXI    D,OPRBX    ;'BX'
  1867.     INX    H
  1868.     RET
  1869. ;
  1870. TRNRPP:    INX    H
  1871.     MOV    A,M
  1872.     ANI    5FH
  1873.     CPI    'S'
  1874.     JNZ    TRNRP4
  1875.     INX    H
  1876.     MOV    A,M
  1877.     ANI    5FH
  1878.     CPI    'W'
  1879.     JNZ    TRNRP3
  1880.     LXI    D,OPRAX    ;'AX'
  1881.     INX    H
  1882.     RET
  1883. ;
  1884. TRNRP3:    DCX    H
  1885. TRNRP4:    DCX    H
  1886.     JMP    TRNRP2
  1887. ;
  1888. TRNRPS:    INX    H
  1889.     MOV    A,M
  1890.     ANI    5FH
  1891.     CPI    'P'
  1892.     JNZ    TRNRP4
  1893.     LXI    D,OPRSP
  1894.     INX    H
  1895.     RET
  1896. ;
  1897. OPRAX    DB    'AX',0
  1898. OPRCX    DB    'CX',0
  1899. OPRDX    DB    'DX',0
  1900. OPRBX    DB    'BX',0
  1901. OPRSP    DB    'SP',0
  1902.  
  1903. ;
  1904. ;    Strange opcodes
  1905. ;
  1906. DOTDL:    LDA    OPCBUF+1
  1907.  
  1908.     LXI    H,CCZ    ;'Z '
  1909.     CPI    'E'
  1910.     JZ    DOTDL1
  1911.     LXI    H,CCNZ    ;'NZ'
  1912.     CPI    'N'
  1913.     JZ    DOTDL1
  1914.     LXI    H,CCC    ;'C '
  1915.     CPI    'L'
  1916.     JZ    DOTDL1
  1917.     LXI    H,CCNC    ;'NC'
  1918.  
  1919.     CPI    'G'
  1920.     JZ    DOTDL1
  1921.     LXI    H,CCZL
  1922.     CPI    'e'
  1923.     JZ    DOTDL1
  1924.     LXI    H,CCNZL
  1925.     CPI    'n'
  1926.     JZ    DOTDL1
  1927.     LXI    H,CCCL
  1928.     CPI    'l'
  1929.     JZ    DOTDL1
  1930.     LXI    H,CCNCL
  1931.  
  1932. DOTDL1:    MOV    A,M
  1933.     STA    OPCBUF+1
  1934.     INX    H
  1935.     MOV    A,M
  1936.     STA    OPCBUF+2
  1937.     RET
  1938. ;
  1939. CCZ    DB    'Z '
  1940. CCNZ    DB    'NZ'
  1941. CCC    DB    'C '
  1942. CCNC    DB    'NC'
  1943.  
  1944. CCZL    DB    'z '
  1945. CCNZL    DB    'nz'
  1946. CCCL    DB    'c '
  1947. CCNCL    DB    'nc'
  1948.  
  1949. ;
  1950. ;    Return conditional
  1951. ;    RC -> JNC $+3, RET
  1952. ;
  1953. DORET:    CALL    PUTOPC
  1954.     CALL    PUTHT    ; Could be PUTHTS
  1955.     LXI    H,REL3
  1956.     CALL    PUTLIN
  1957.     CALL    SEP
  1958.     LXI    H,OPRET
  1959.     CALL    PUTOPS
  1960.     JMP    PUTOPR
  1961. ;
  1962. REL3    DB    '$+3',0
  1963. OPRET    DB    'RET',0
  1964.  
  1965. ;
  1966. ;    Call conditional
  1967. ;    CC label -> JNC $+5, CALL label
  1968. ;
  1969. DOCALL:    CALL    PUTOPC
  1970.     CALL    PUTHT    ; Could be PUTHTS
  1971.  
  1972.     LXI    H,REL5
  1973.     CALL    PUTLIN
  1974.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  1975.     LXI    H,OPCALL
  1976.     CALL    PUTOPS
  1977.     CALL    PUTHTS
  1978.     JMP    PUTOPR
  1979. ;
  1980. REL5    DB    '$+5',0
  1981. OPCALL    DB    'CALL',0
  1982.  
  1983. ;
  1984. ;    Jump conditional
  1985. ;    JC label -> JNC $+5, JMP label
  1986. ;
  1987. DOJMP:    CALL    PUTOPC
  1988.     CALL    PUTHT    ; Could be PUTHTS
  1989.  
  1990.     LXI    H,REL5
  1991.     CALL    PUTLIN
  1992.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  1993.     LXI    H,OPJMP
  1994.     CALL    PUTOPS
  1995.     CALL    PUTHTS
  1996.     JMP    PUTOPR
  1997. ;
  1998. OPJMP    DB    'JMP',0
  1999.  
  2000. ;
  2001. ;    IN n -> IN AL,n
  2002. ;
  2003. DOIN:    JMP    DOIMM
  2004.  
  2005. ;
  2006. ;    LDA addr -> MOV AL,addr
  2007. ;
  2008. DOLDA:    JMP    DOIMM
  2009.  
  2010. ;
  2011. ;           XCHG BX,rp'
  2012. ;    LDAX rp -> MOV AL,[BX]
  2013. ;           XCHG BX,rp'
  2014. ;
  2015. DOLDAX:    LHLD    xOPRND
  2016.     CALL    TRNRP    ; DE -> trans, HL -> next
  2017.     JNZ    PUTCOD
  2018.  
  2019.     PUSH    H
  2020.     LXI    H,OPXCHG
  2021.     CALL    PUTOPS
  2022.     CALL    PUTHTS
  2023.     LXI    H,OPBXC
  2024.     CALL    PUTOPS
  2025.     XCHG
  2026.     PUSH    H
  2027.     CALL    PUTRND
  2028.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  2029.  
  2030.     LXI    H,OPMOV
  2031.     CALL    PUTOPS
  2032.     CALL    PUTHTS
  2033.     LXI    H,OPLDAX
  2034.     CALL    PUTOPS
  2035.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  2036.  
  2037.     LXI    H,OPXCHG
  2038.     CALL    PUTOPS
  2039.     CALL    PUTHTS
  2040.     LXI    H,OPBXC
  2041.     CALL    PUTOPS
  2042.     POP    H    ; HL -> rp'
  2043.     CALL    PUTRND
  2044.  
  2045.     POP    H
  2046.     JMP    PUTEND
  2047. ;
  2048. OPMOV    DB    'MOV',0
  2049. OPLDAX    DB    'AL,[BX]',0
  2050.  
  2051. ;
  2052. ;    LHLD addr -> MOV BX,addr
  2053. ;
  2054. DOLHLD:    CALL    PUTOPHT
  2055.     LXI    H,OPBXC    ; 'BX,'
  2056.     CALL    PUTOPS
  2057.     JMP    PUTOPR
  2058.  
  2059. ;
  2060. ;    OUT n -> OUT n,AL
  2061. ;
  2062. DOOUT:    CALL    PUTOPHT
  2063.     CALL    PUTEXP
  2064.     PUSH    H
  2065.     LXI    H,OPCAL    ; ',AL'
  2066.     JMP    DOSTA1
  2067.  
  2068. ;
  2069. ;    PCHL -> JMP BX
  2070. ;
  2071. DOPCHL:    CALL    PUTOPHT
  2072.     LXI    H,OPRBX    ; 'BX'
  2073.     CALL    PUTOPS
  2074.     JMP    PUTOPR
  2075.  
  2076. ;
  2077. ;    RST -> CALL 8*
  2078. ;
  2079. DORST:    CALL    PUTOPHT
  2080.     LXI    H,OPR8M    ;'8*'
  2081.     CALL    PUTOPS
  2082.     JMP    PUTOPR
  2083. ;
  2084. OPR8M    DB    '8*',0
  2085.  
  2086. ;
  2087. ;    SHLD addr -> MOV addr,BX
  2088. ;
  2089. DOSHLD:    CALL    PUTOPHT
  2090.     CALL    PUTEXP
  2091.     PUSH    H
  2092.     LXI    H,OPCBX    ; ',BX'
  2093.     JMP    DOSTA1
  2094. ;
  2095. OPCBX    DB    ',BX',0
  2096.  
  2097. ;
  2098. ;    SPHL -> MOV SP,BX
  2099. ;
  2100. DOSPHL:    CALL    PUTOPHT
  2101.     LXI    H,OPSPBX ; 'SP,BX'
  2102.     CALL    PUTOPS
  2103.     JMP    PUTOPR
  2104. ;
  2105. OPSPBX    DB    'SP,BX',0
  2106.  
  2107. ;
  2108. ;    STA addr -> MOV addr,AL
  2109. ;
  2110. DOSTA:    CALL    PUTOPHT
  2111.     CALL    PUTEXP
  2112.     PUSH    H
  2113.     LXI    H,OPCAL    ; ',AL'
  2114. DOSTA1:    CALL    PUTOPS
  2115.     POP    H
  2116.     JMP    PUTEND
  2117. ;
  2118. OPCAL    DB    ',AL',0
  2119.  
  2120. ;
  2121. ;           XCHG BX,rp'
  2122. ;    STAX rp -> MOV [BX],AL
  2123. ;           XCHG BX,rp'
  2124. ;
  2125. DOSTAX:    LHLD    xOPRND
  2126.     CALL    TRNRP    ; DE -> trans, HL -> next
  2127.     JNZ    PUTCOD
  2128.  
  2129.     PUSH    H
  2130.     LXI    H,OPXCHG
  2131.     CALL    PUTOPS
  2132.     CALL    PUTHTS
  2133.     LXI    H,OPBXC
  2134.     CALL    PUTOPS
  2135.     XCHG
  2136.     PUSH    H
  2137.     CALL    PUTRND
  2138.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  2139.  
  2140.     LXI    H,OPMOV
  2141.     CALL    PUTOPS
  2142.     CALL    PUTHTS
  2143.     LXI    H,OPSTAX
  2144.     CALL    PUTOPS
  2145.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  2146.  
  2147.     LXI    H,OPXCHG
  2148.     CALL    PUTOPS
  2149.     CALL    PUTHTS
  2150.     LXI    H,OPBXC
  2151.     CALL    PUTOPS
  2152.     POP    H    ; HL -> rp'
  2153.     CALL    PUTRND
  2154.  
  2155.     POP    H
  2156.     JMP    PUTEND
  2157. ;
  2158. OPSTAX    DB    '[BX],AL',0
  2159.  
  2160. ;
  2161. ;    XCHG -> XCHG BX,DX
  2162. ;
  2163. DOXCHG:    CALL    PUTOPHT
  2164.     LXI    H,OPBXDX ; 'BX,DX'
  2165.     CALL    PUTOPS
  2166.     JMP    PUTOPR
  2167. ;
  2168. OPBXDX    DB    'BX,DX',0
  2169.  
  2170. ;
  2171. ;        XCHG SP,BP
  2172. ;    XTHL -> XCHG [BP],BX
  2173. ;        XCHG SP,BP
  2174. ;
  2175. DOXTHL:    LXI    H,OPXCHG
  2176.     CALL    PUTOPS
  2177.     CALL    PUTHTS
  2178.     LXI    H,OPSPBP ; 'SP,BP'
  2179.     CALL    PUTOPS
  2180.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  2181.  
  2182.     LXI    H,OPXCHG
  2183.     CALL    PUTOPS
  2184.     CALL    PUTHTS
  2185.     LXI    H,OPXTHL
  2186.     CALL    PUTOPS
  2187.     CALL    SEP    ; SP,EP,SP or CR, LF, HT
  2188.  
  2189.     LXI    H,OPXCHG
  2190.     CALL    PUTOPS
  2191.     CALL    PUTHTS
  2192.     LXI    H,OPSPBP
  2193.     CALL    PUTOPS
  2194.     JMP    PUTOPR
  2195. ;
  2196. OPSPBP    DB    'SP,BP',0
  2197. OPXTHL    DB    '[BP],BX',0
  2198.  
  2199. ;
  2200. ;    CMA -> NOT AL
  2201. ;
  2202. DOCMA:    CALL    PUTOPHT
  2203.     LXI    H,ALREG
  2204.     CALL    PUTOPS
  2205.     JMP    PUTOPR
  2206.  
  2207. ;
  2208. ;    Put 'expression' to output file.
  2209. ;    'expression' is everything between
  2210. ;    (xOPRND) up to the tab or spaces before
  2211. ;    a ';' or CR.
  2212. ;
  2213. PUTEXP:    LHLD    xOPRND
  2214. PUTEX1:    MOV    A,M
  2215.  
  2216.     CPI    ';'
  2217.     JZ    PUTEX4
  2218.     CPI    CR
  2219.     JZ    PUTEX4
  2220.  
  2221.     CPI    '!'
  2222.     JZ    PUTEX3
  2223.  
  2224. PUTEX2:    INX    H
  2225.     JMP    PUTEX1
  2226.  
  2227. PUTEX3:    DCX    H
  2228.     MOV    A,M
  2229.     INX    H
  2230.     CPI    ' '
  2231.     JZ    PUTEX4
  2232.     CPI    HT
  2233.     JZ    PUTEX4
  2234.     JMP    PUTEX2
  2235.  
  2236. ;
  2237. PUTEX4:    DCX    H
  2238.     MOV    A,M
  2239.     CPI    ' '
  2240.     JZ    PUTEX4
  2241.     CPI    HT
  2242.     JZ    PUTEX4
  2243.     INX    H
  2244.     XCHG
  2245.     LHLD    xOPRND
  2246. PUTEX5:    MOV    A,D
  2247.     CMP    H
  2248.     JNZ    PUTEX6
  2249.     MOV    A,E
  2250.     CMP    L
  2251.     RZ
  2252. PUTEX6:    MOV    A,M
  2253.     CALL    PUTCHR
  2254.     INX    H
  2255.     JMP    PUTEX5
  2256.  
  2257. ;
  2258. ;    IFC -> IF
  2259. ;
  2260. DOIFC:    MVI    A,HT
  2261.     STA    ENDIFL
  2262.     JMP    DOUPS
  2263.  
  2264. ;
  2265. ;    ICL -> *INCL
  2266. ;
  2267. DOICL:    MVI    A,HT
  2268.     STA    ICLFLG
  2269.     JMP    DOUPS
  2270.  
  2271. ;
  2272. ;    LST -> LIST
  2273. ;
  2274. DOLST:    MVI    A,HT
  2275.     STA    LSTFLG
  2276.     JMP    DOUPS
  2277.  
  2278. ;
  2279. ;    MAC -> MACRO
  2280. ;
  2281. DOMAC:    MVI    A,HT
  2282.     STA    MACFLG
  2283. DOUPS:    CALL    PUTOPHT
  2284.     MVI    A,CR
  2285.     STA    UPSMSG
  2286.     JMP    PUTOPR
  2287.  
  2288. ;*******************************************************
  2289. ;
  2290. ;    File operations
  2291. ;
  2292. ;*******************************************************
  2293. ;
  2294. ;    Set up input and output FCB's from DFCB
  2295. ;
  2296. MAKFNS:    LXI    H,DFCB1
  2297.     LXI    D,INFCB
  2298.     LXI    B,FNLEN+1
  2299.     CALL    MOVIR
  2300.     MOV    A,M    ; typ specified ?
  2301.     CPI    ' '
  2302.     JZ    MKFNS1
  2303.     CPI    '?'
  2304.     JZ    MKFNS1
  2305.     LXI    B,3
  2306.     CALL    MOVIR
  2307. MKFNS1:
  2308.     LXI    H,DFCB1
  2309.     LXI    D,OUTFCB
  2310.     LXI    B,FNLEN+1
  2311.     CALL    MOVIR
  2312.  
  2313.     LDA    DFCB2    ;
  2314.     ORA    A    ; allows output to
  2315.     JZ    MKFNS2    ; different drive
  2316.     STA    OUTFCB    ; than input
  2317. MKFNS2:
  2318.     LDA    DFCB2+1    ;
  2319.     CPI    ' '    ;
  2320.     JZ    MKFNS3    ; allows output
  2321.     LXI    B,8    ; file to have
  2322.     LXI    D,OUTFCB+1 ; different name
  2323.     LXI    H,DFCB2+1 ; from input file
  2324.     CALL    MOVIR
  2325. MKFNS3:
  2326.     LDA    DFCB2+9
  2327.     CPI    ' '
  2328.     JZ    MKFNS4
  2329.     LXI    B,3
  2330.     LXI    D,OUTFCB+9
  2331.     LXI    H,DFCB2+9
  2332.     CALL    MOVIR
  2333. MKFNS4:
  2334.     LXI    D,PRFNM1
  2335.     CALL    PRTLIN
  2336.     LXI    H,INFCB
  2337.     CALL    PRFNAM
  2338.     LXI    D,PRFNM2
  2339.     CALL    PRTLIN
  2340.     LXI    H,OUTFCB
  2341.     CALL    PRFNAM
  2342.     LXI    D,CRLFMG
  2343.     CALL    PRTLIN
  2344.     RET
  2345.  
  2346. ;
  2347. ;    Print Filenames
  2348. ;
  2349. PRFNAM:    MOV    A,M    ; disk number
  2350.     ORA    A
  2351.     JNZ    PRFN1
  2352.     LDA    xCDISK
  2353. PRFN1:    ADI    '@'
  2354.     CALL    CONOUT
  2355.     MVI    A,':'
  2356.     CALL    CONOUT
  2357.     INX    H
  2358.     MVI    B,8
  2359.     CALL    PRFN
  2360.     MVI    A,'.'
  2361.     CALL    CONOUT
  2362.     MVI    B,3
  2363. PRFN:    MOV    A,M
  2364.     INX    H
  2365.     CPI    ' '
  2366.     CNZ    CONOUT
  2367.     DCR    B
  2368.     JNZ    PRFN
  2369.     RET
  2370. ;
  2371. PRFNM1    DB    'Source File: ',0
  2372. PRFNM2    DB    ',  Destination File: ',0
  2373.  
  2374. ;
  2375. ;    Open source file with ext ASM
  2376. ;
  2377. OPENIN:
  2378.     LXI    D,INFCB
  2379.     MVI    C,nOPEN
  2380.     CALL    BDOS
  2381.     CPI    NFF
  2382.     JZ    NSFERR
  2383.     MVI    A,RECLEN
  2384.     LXI    H,IBUFF+IBFLEN
  2385.     SHLD    xIBUFF
  2386.     RET
  2387. ;
  2388. NSFERR:    LXI    D,NSFMSG ;'No Source File'
  2389.     JMP    EREXIT
  2390. ;
  2391. NSFMSG    DB    'No Source File Found'
  2392.     DB    CR,LF,BEL,0
  2393. ;
  2394. INFCB    DB    0,0,0,0,0,0,0,0
  2395.     DB    0,'ASM',0,0,0,0
  2396.     DB    0,0,0,0,0,0,0,0
  2397.     DB    0,0,0,0,0,0,0,0
  2398.     DB    0
  2399.  
  2400. ;
  2401. ;    Create output file with ext Z80
  2402. ;
  2403. CREATO:
  2404.     LXI    D,OUTFCB
  2405.     MVI    C,nOPEN
  2406.     CALL    BDOS
  2407.     CPI    NFF
  2408.     JNZ    OFEERR
  2409. CREAT4:    LXI    D,OUTFCB
  2410.     MVI    C,nCREAT
  2411.     CALL    BDOS
  2412.     CPI    NFF
  2413.     JZ    NDSERR
  2414.     LXI    D,OUTFCB
  2415.     MVI    C,nOPEN
  2416.     CALL    BDOS
  2417.     MVI    A,RECLEN
  2418.     STA    OBUFCT
  2419.     LXI    H,OBUFF
  2420.     SHLD    xOBUFF
  2421.     RET
  2422. ;
  2423. NDSERR:    LXI    D,NDSMSG ;'No directory space'
  2424.     JMP    EREXIT
  2425. ;
  2426. NDSMSG    DB    'No Directory Space'
  2427.     DB    CR,LF,BEL,0
  2428. ;
  2429. OUTFCB    DB    0,0,0,0,0,0,0,0
  2430.     DB    0,'A86',0,0,0,0
  2431.     DB    0,0,0,0,0,0,0,0
  2432.     DB    0,0,0,0,0,0,0,0
  2433.     DB    0
  2434. ;
  2435. ;
  2436. OFEERR:    LXI    D,OFEMSG ;'Output file exists'
  2437.     CALL    PRTLIN
  2438.     CALL    CHKYES
  2439.     JNZ    ABORT
  2440.     LXI    D,OUTFCB
  2441.     MVI    C,nDEL
  2442.     CALL    BDOS
  2443.     JMP    CREAT4
  2444. ;
  2445. OFEMSG    DB    'Output File Already Exists'
  2446.     DB    ' -- Delete it and Continue ? (Y/N) '
  2447.     DB    BEL,0
  2448.  
  2449. ;*******************************************************
  2450. ;
  2451. ;    Put line at HL to output file until 0.
  2452. ;
  2453. PUTLIN:    MOV    A,M
  2454.     ANA    A
  2455.     RZ
  2456.     CALL    PUTCHR
  2457.     INX    H
  2458.     JMP    PUTLIN
  2459.  
  2460. ;
  2461. ;    Put spaces or tabs at HL to output
  2462. ;    file until non-(space or tab)
  2463. ;
  2464. PUTSPT:    MOV    A,M
  2465.     CPI    ' '
  2466.     JZ    PUTSP1
  2467.     CPI    HT
  2468.     RNZ
  2469. PUTSP1:    CALL    PUTCHR
  2470.     INX    H
  2471.     JMP    PUTSPT
  2472.  
  2473. ;
  2474. ;    Put statement separator to output file.
  2475. ;
  2476. SEP:    LHLD    SEPMSG
  2477.     JMP    PUTLIN
  2478. ;
  2479. SEPMSG    DW    NEWLSP
  2480. EXCLSP    DB    ' ! ',0
  2481. NEWLSP    DB    CR,LF,HT,0
  2482.  
  2483. ;
  2484. ;    Put CR, LF to output file.
  2485. ;
  2486. PCRLF:    MVI    A,CR
  2487.     CALL    PUTCHR
  2488.     MVI    A,LF
  2489.  
  2490. ;
  2491. ;    Put char in A to output file,
  2492. ;    update column number.
  2493. ;
  2494. PUTCHR:    PUSH    H
  2495.     PUSH    D
  2496.     PUSH    B
  2497.     PUSH    PSW
  2498.  
  2499.     STA    TEMP
  2500.     LHLD    xOBUFF
  2501.     CPI    EOT
  2502.     JNZ    PCHR0
  2503.     MVI    A,'!'
  2504. PCHR0:    MOV    M,A
  2505.     CPI    CR
  2506.     JZ    PUTCH0
  2507.     CPI    LF
  2508.     JZ    PUTCH0
  2509.     CPI    HT
  2510.     JNZ    PUTCH1
  2511.     LDA    COLNUM
  2512.     DCR    A
  2513.     ANI    NF8
  2514.     ADI    N09
  2515.     JMP    PUTCH2
  2516.  
  2517. PUTCH0:    MVI    A,1
  2518.     JMP    PUTCH2
  2519. ;
  2520. PUTCH1:    LDA    COLNUM
  2521.     INR    A
  2522. PUTCH2:    STA    COLNUM
  2523.  
  2524.     INX    H    ;inc obuff ptr
  2525.     LDA    OBUFCT
  2526.     DCR    A    ;dec obuff count
  2527.     JNZ    PTCH21
  2528.     MVI    A,RECLEN
  2529. PTCH21:    STA    OBUFCT
  2530.     MOV    A,H
  2531.     CPI    (OBUFF+OBFLEN)/256
  2532.     JNZ    PUTCH4
  2533.     MOV    A,L
  2534.     CPI    (OBUFF+OBFLEN) MOD 256
  2535.  
  2536.     JNZ    PUTCH4
  2537.     LXI    D,OBUFF
  2538. PUTCH3:
  2539.     MVI    C,nDMA
  2540.     PUSH    D
  2541.     CALL    BDOS
  2542.     POP    D
  2543.  
  2544.     XCHG
  2545.  
  2546.     LXI    D,OUTFCB
  2547.     CALL    WRTREC    ;write record
  2548.  
  2549.     LXI    D,RECLEN
  2550.     DAD    D
  2551.     XCHG
  2552.     MOV    A,D
  2553.     CPI    (OBUFF+OBFLEN)/256
  2554.     JNZ    PUTCH3
  2555.     MOV    A,E
  2556.     CPI    (OBUFF+OBFLEN) MOD 256
  2557.     JNZ    PUTCH3
  2558.  
  2559.     LXI    H,OBUFF
  2560.  
  2561. PUTCH4:    SHLD    xOBUFF
  2562.     POP    PSW
  2563.     POP    B
  2564.     POP    D
  2565.     POP    H
  2566.     RET
  2567. ;
  2568. TEMP    DB    0
  2569.  
  2570. ;
  2571. ;    Write record.
  2572. ;
  2573. WRTREC:    MVI    C,nWRNR
  2574.     PUSH    H
  2575.     CALL    BDOS
  2576.     POP    H
  2577.     ANA    A
  2578.     RZ
  2579.     LXI    D,OFWMSG ;'output file write error'
  2580.     JMP    EREXIT
  2581. ;
  2582. OFWMSG    DB    'Output File Write Error'
  2583.     DB    CR,LF,BEL,0
  2584.  
  2585. ;
  2586. ;    Fill rest of obuff with EOF,
  2587. ;    write record, and close file.
  2588. ;
  2589. CLOSEO:    MVI    A,EOF
  2590.     CALL    PUTCHR
  2591.     LDA    OBUFCT
  2592.     CPI    RECLEN
  2593.     JNZ    CLOSEO
  2594. ;
  2595. CLOSE1:
  2596.     LXI    D,OBUFF
  2597.     LHLD    xOBUFF
  2598.     MOV    A,H
  2599.     CMP    D
  2600.     JNZ    CLOSE3
  2601.     MOV    A,L
  2602.     CMP    E
  2603.     JNZ    CLOSE3
  2604. CLOSE2:
  2605.     LXI    D,OUTFCB
  2606.     MVI    C,nCLOSE
  2607.     JMP    BDOS
  2608. ;
  2609. CLOSE3:    MVI    C,nDMA
  2610.     PUSH    D
  2611.     CALL    BDOS
  2612.     POP    D
  2613.     XCHG
  2614.     LXI    D,OUTFCB
  2615.     CALL    WRTREC
  2616.     LXI    D,RECLEN
  2617.     DAD    D
  2618.     XCHG
  2619.     LDA    xOBUFF+1
  2620.     CMP    D
  2621.     JNZ    CLOSE3
  2622.     LDA    xOBUFF
  2623.     CMP    E
  2624.     JNZ    CLOSE3
  2625.     JMP    CLOSE2
  2626.  
  2627. ;
  2628. ;    Print line at DE until 0
  2629. ;    on console.
  2630. ;
  2631. PRTLIN:    LDAX    D
  2632.     ANA    A
  2633.     RZ
  2634.     CALL    CONOUT
  2635.     INX    D
  2636.     JMP    PRTLIN
  2637.  
  2638. ;
  2639. ;    Console Output character in A.
  2640. ;
  2641. CONOUT:    PUSH    PSW
  2642.     PUSH    B
  2643.     PUSH    D
  2644.     PUSH    H
  2645.     MOV    E,A
  2646.     MVI    D,N00
  2647.     MVI    C,nCOUT
  2648.     CALL    BDOS
  2649.     POP    H
  2650.     POP    D
  2651.     POP    B
  2652.     POP    PSW
  2653.     RET
  2654.  
  2655. ;
  2656. ;    Get char from CONSOLE and return
  2657. ;    Z set if char.AND.5FH = 'Y'
  2658. ;
  2659. CHKYES:    MVI    C,nCIN
  2660.     CALL    BDOS
  2661.     PUSH    PSW
  2662.     CALL    CRLF
  2663.     POP    PSW
  2664.     ANI    5FH
  2665.     CPI    'Y'
  2666.     RET
  2667.  
  2668. ;
  2669. ;    Return Z if no char available,
  2670. ;    otherwise, get char in A.
  2671. ;
  2672. CHKIN:    MVI    C,nCDAV
  2673.     CALL    BDOS
  2674.     ORA    A
  2675.     RZ
  2676.     MVI    C,nCIN
  2677.     CALL    BDOS
  2678.     RET
  2679.  
  2680. ;
  2681. ;
  2682. ;
  2683. CRLF:    LXI    D,CRLFMG
  2684.     JMP    PRTLIN
  2685. ;
  2686. CRLFMG    DB    CR,LF,0
  2687.  
  2688. ;
  2689. ;    Convert upper to lower case in A.
  2690. ;
  2691. LCASE:    CPI    'A'
  2692.     RC
  2693.     CPI    'Z'+1
  2694.     RNC
  2695.     ORI    20H
  2696.     RET
  2697.  
  2698. ;
  2699. ;    Convert lower case to upper case in A.
  2700. ;
  2701. UCASE:    CPI    'a'
  2702.     RC
  2703.     CPI    'z'+1
  2704.     RNC
  2705.     ANI    5FH
  2706.     RET
  2707.  
  2708. ;
  2709. ;    Print activity dot every 100 lines.
  2710. ;
  2711. PDOT:    LDA    LNCNT
  2712.     DCR    A
  2713.     STA    LNCNT
  2714.     RNZ
  2715.     MVI    A,'.'
  2716.     CALL    CONOUT
  2717.     MVI    A,100    ; Dot every 100 lines
  2718.     STA    LNCNT
  2719.  
  2720.     LDA    DOTCNT
  2721.     DCR    A
  2722.     STA    DOTCNT
  2723.     JNZ    PDOT1
  2724.     MVI    A,' '
  2725.     CALL    CONOUT
  2726.     MVI    A,10    ; Space every 10 dots
  2727.     STA    DOTCNT
  2728.  
  2729. PDOT1:    LDA    NLCNT
  2730.     DCR    A
  2731.     STA    NLCNT
  2732.     RNZ
  2733.     CALL    CRLF
  2734.     MVI    A,50    ; 50 dots per line
  2735.     STA    NLCNT
  2736.     RET
  2737. ;
  2738. LNCNT    DB    100    ; dot every 100 lines
  2739. DOTCNT    DB    10    ; space every 10 dots
  2740. NLCNT    DB    50    ; 50 dots per line
  2741.  
  2742. ;
  2743. ;    Uninitialized storage.
  2744. ;
  2745. xCDISK    DS    1
  2746. SPBDOS    DS    2
  2747.     DS    STCKLN
  2748. STACK    EQU    $
  2749. COLNUM    DS    1
  2750. xOPCOD    DS    2
  2751. OPCBUF    DS    OPBFLN
  2752. xOPRND    DS    2
  2753. xOBUFF    DS    2
  2754. OBUFCT    DS    1
  2755. OBUFF    DS    OBFLEN
  2756. LBUFF    DS    LBUFLN+3
  2757. xIBUFF    DS    2
  2758. IBUFF    DS    IBFLEN
  2759.  
  2760.     END    START
  2761. 
  2762. ;
  2763. CLOSEO:    MVI    A,EOF
  2764.     CALL    PUTCHR
  2765.     LDA    OBU